home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / tpu55a.zip / TPURPT1.PAS < prev    next >
Pascal/Delphi Source File  |  1990-08-05  |  5KB  |  226 lines

  1. {$D+,S+,L+,R-,I+}
  2.  
  3. UNIT TPURPT1;
  4.  
  5. (*****************)
  6. (**) INTERFACE (**)
  7. (*****************)
  8.  
  9. USES Dos;
  10. CONST
  11.     Ctl_CRLF = ^M^J;    { "new-line" sequence for MS/PC Dos }
  12.     Ctl_FF   = ^L;        { "new-page" sequence for MS/PC Dos }
  13.  
  14. TYPE  FileFlags = (FileActive,FileQuiet,FileFailure);
  15.  
  16. VAR    LinesRemaining,        { on current page }
  17.     ColumnsRemaining,    { on current line }
  18.     ColumnsUsed        { on current line }
  19.             : LongInt;
  20.     FileStatus     : FileFlags;
  21.  
  22. PROCEDURE PutTxt(S : String);
  23. PROCEDURE PutCtl(S : String);
  24. PROCEDURE SetCol(I : Integer);
  25. PROCEDURE NewTxtLine;
  26. PROCEDURE NewTxtPage;
  27. PROCEDURE OpenTxt(S : String; LineMax, ColumnMax : Integer);
  28. PROCEDURE CloseTxt;
  29.  
  30. (**********************)
  31. (**) IMPLEMENTATION (**)
  32. (**********************)
  33.  
  34. CONST
  35.     Ctl_EOF  = ^Z;    { "end-file" sequence for MS/PC Dos }
  36.     Ctl_CR   = ^M;    { "Carriage-Return"                 }
  37.     Ctl_LF   = ^J;    { "Line-Feed"                       }
  38.  
  39. VAR    MaxLinesOnPage,
  40.     MaxColsPerLine,
  41.     CurrentLine,
  42.     CurrentColumn : LongInt;
  43.  
  44.     NoLineWrap, NoPageBreak : Boolean;
  45.  
  46.     FileState : FileFlags;
  47.     TextFile  : Text;
  48.  
  49. PROCEDURE FeedBack;
  50. BEGIN
  51.     IF NOT (FileState = FileActive) THEN
  52.     BEGIN
  53.         LinesRemaining   := 0;
  54.         ColumnsRemaining := 0;
  55.         ColumnsUsed      := 0;
  56.     END ELSE
  57.     BEGIN
  58.         LinesRemaining   := MaxLinesOnPage - CurrentLine   + 1;
  59.         ColumnsRemaining := MaxColsPerLine - CurrentColumn + 1;
  60.         ColumnsUsed      := CurrentColumn  - 1;
  61.     END;
  62.     FileStatus := FileState;
  63. END;    {FeedBack}
  64.  
  65. PROCEDURE PutCR;
  66. BEGIN
  67.     PutCtl(Ctl_CR);
  68.     CurrentColumn := 1;
  69. END;
  70.  
  71. PROCEDURE PutLF;
  72. BEGIN
  73.     IF NoPageBreak
  74.     THEN PutCtl(Ctl_LF)
  75.     ELSE
  76.         IF CurrentLine = MaxLinesOnPage THEN
  77.         BEGIN
  78.             PutCtl(Ctl_LF);
  79.             PutCtl(Ctl_FF);
  80.             CurrentLine := 0
  81.         END
  82.         ELSE    PutCtl(Ctl_LF);
  83.  
  84.     Inc(CurrentLine);
  85. END;
  86.  
  87. PROCEDURE PutCRLF;
  88. BEGIN    PutCR;    PutLF;    END;
  89.  
  90. PROCEDURE PutFF;
  91. BEGIN    PutCtl(Ctl_FF);    CurrentLine := 1;    END;
  92.  
  93. PROCEDURE PutEOF;
  94. BEGIN    PutCtl(Ctl_EOF);    END;
  95.  
  96. FUNCTION ScanCtls(S : String):Integer;
  97. LABEL Found;
  98. VAR J : Integer; I, L : Byte;
  99. BEGIN
  100.     J := 0; L := Length(S);
  101.     FOR I := 1 TO L DO
  102.         IF S[I] in [Ctl_EOF,Ctl_FF,Ctl_LF,Ctl_CR]
  103.         THEN BEGIN
  104.             J := I; GOTO Found
  105.         END;
  106. Found:
  107.     ScanCtls := J
  108. END;
  109.  
  110. PROCEDURE PutTxt(S : String);
  111. VAR CtlPos, Slice : Integer;
  112. BEGIN
  113.     CtlPos := ScanCtls(S);
  114.     WHILE Length(S) > 0 DO BEGIN
  115.         IF CurrentColumn > MaxColsPerLine THEN PutCRLF;
  116.         IF CurrentLine   > MaxLinesOnPage THEN PutFF;
  117.         Slice := Length(S);
  118.         IF CtlPos = 0
  119.         THEN CtlPos := Slice + 1
  120.         ELSE
  121.             IF Slice > CtlPos
  122.             THEN Slice := CtlPos - 1;
  123.         IF Slice > MaxColsPerLine THEN Slice := MaxColsPerLine;
  124.         IF Slice > 0 THEN
  125.         BEGIN
  126.             PutCtl(Copy(S,1,Slice));
  127.             Delete(S,1,Slice);
  128.             CtlPos := CtlPos - Slice;
  129.             CurrentColumn := CurrentColumn + Slice
  130.         END ELSE
  131.         BEGIN
  132.             IF S[1] = Ctl_EOF THEN PutEOF ELSE
  133.             IF S[1] = Ctl_FF  THEN PutFF  ELSE
  134.             IF S[1] = Ctl_LF  THEN PutLF  ELSE
  135.             IF S[1] = Ctl_CR  THEN PutCR;
  136.             Delete(S,1,1);
  137.             IF Length(S) > 0 THEN CtlPos := ScanCtls(S);
  138.         END;
  139.     END; {WHILE}
  140.     FeedBack;
  141. END;
  142.  
  143. PROCEDURE PutCtl(S : String);
  144. BEGIN
  145.     IF FileState = FileActive THEN
  146.     BEGIN
  147.         {$I-} Write(TextFile,S); {$I+}
  148.         IF IOResult <> 0 THEN CloseTxt
  149.     END;
  150. END;
  151.  
  152. PROCEDURE NewTxtLine;
  153. BEGIN
  154.     PutCRLF;
  155.     FeedBack;
  156. END;
  157.  
  158. PROCEDURE NewTxtPage;
  159. BEGIN
  160.     IF CurrentColumn > 1 THEN PutCRLF;
  161.     PutFF;
  162.     FeedBack;
  163. END;
  164.  
  165. PROCEDURE OpenTxt(S : String; LineMax, ColumnMax : Integer);
  166. BEGIN
  167.     IF FileState = FileActive THEN CloseTxt;
  168.  
  169.     Assign(TextFile,S);
  170.     NoPageBreak := (LineMax < 1) OR (LineMax > 255);
  171.     IF NoPageBreak
  172.         THEN MaxLinesOnPage := MaxLongInt
  173.         ELSE MaxLinesOnPage := LineMax;
  174.     NoLineWrap  := (ColumnMax < 1) OR (ColumnMax > 255);
  175.     IF NoLineWrap
  176.         THEN MaxColsPerLine := MaxLongInt
  177.         ELSE MaxColsPerLine := ColumnMax;
  178.     CurrentLine    := 1;
  179.     CurrentColumn  := 1;
  180.     FileState      := FileActive;
  181.  
  182.     {$I-} ReWrite(TextFile); {$I+}
  183.  
  184.     IF IOResult <> 0 THEN FileState := FileFailure;
  185.     IF FileState = FileFailure
  186.     THEN CloseTxt
  187.     ELSE FeedBack;
  188. END;
  189.  
  190. PROCEDURE SetCol(I : Integer);
  191. BEGIN
  192.     IF FileState = FileActive THEN
  193.     IF MaxColsPerLine > I   THEN
  194.     BEGIN
  195.         IF CurrentColumn  > I THEN PutCRLF;
  196.         WHILE CurrentColumn < I DO PutTxt(' ')
  197.     END;
  198.     FeedBack;
  199. END;
  200.  
  201. PROCEDURE CloseTxt;
  202. BEGIN
  203.     IF FileState = FileActive THEN
  204.     BEGIN
  205.         PutEOF;
  206.         {$I-} Close(TextFile); {$I+}
  207.         MaxLinesOnPage := 0;
  208.         MaxColsPerLine := 0;
  209.         CurrentLine    := 0;
  210.         CurrentColumn  := 0;
  211.         FileState      := FileQuiet;
  212.         NoLineWrap     := True;
  213.         NoPageBreak    := True;
  214.         FeedBack;
  215.     END;
  216. END;
  217.  
  218. BEGIN    { UNIT INITIALIZATION CODE }
  219.  
  220.     MaxLinesOnPage := 0;
  221.     MaxColsPerLine := 0;
  222.     CurrentLine    := 0;
  223.     CurrentColumn  := 0;
  224.     FileState      := FileQuiet;
  225.     FeedBack;
  226. END.